package kube

import (
	"fmt"
	"github.com/spf13/cobra"
	"strings"
)

func init() {
	registerSubCmd(upgradeCmd())
}
func upgradeCmd() *cobra.Command {
	supportArgs := "k8s,kube,kubernetes,docker,etcd"

	var dockerDownload bool
	var cmd = &cobra.Command{
		Use:   "upgrade",
		Short: "升级kubernetes集群",
		Long: `升级kubernetes集群 升级需要先通过 opsctl kube init 准备版本的资源
一般只需要升级k8s组件，但也提供了docker和etcd组件的升级
k8s集群升级说明：
  集群升级存在一定风险，请谨慎操作。 
  项目分支master安装的集群可以在当前支持k8s大版本基础上升级任意小版本，比如当前安装集群为1.16.0，你可以方便的升级到任何1.16.x版本
etcd升级说明: etcd 版本只能升级不能降低
docker升级说明：默认升级会短暂中断业务， 设置 --down-docker 时只执行安装docker步骤
`, Args: func(cmd *cobra.Command, args []string) error {
			if len(args) == 0 {
				return fmt.Errorf("请指定要升级的组件")
			}

			for _, arg := range args {
				if !strings.Contains(supportArgs, arg) {
					return fmt.Errorf("仅支持%s 传入%s不支持", supportArgs, arg)
				}
			}

			return nil
		},
		RunE: func(cmd *cobra.Command, args []string) error {
			for _, arg := range args {
				if strings.Contains("k8s,kube,kubernetes", arg) {
					if err := newAnsiblePlaybookAndRun("23.backup.yml"); err != nil {
						return err
					}
					return newAnsiblePlaybookWithTagAndRun("upgrade_k8s", "22.upgrade.yml")
				} else if arg == "etcd" {
					return newAnsiblePlaybookWithTagAndRun("upgrade_etcd", "02.etcd.yml")
				} else if arg == "docker" {
					if dockerDownload {
						return newAnsiblePlaybookWithTagAndRun("download_docker", "03.docker.yml")
					}
					return newAnsiblePlaybookWithTagAndRun("upgrade_docker", "03.docker.yml")
				}
			}
			return nil
		},
	}

	cmd.PersistentFlags().BoolVarP(&dockerDownload, "down-docker", "", false, "是否仅下载docker")

	return cmd
}
